home *** CD-ROM | disk | FTP | other *** search
/ Delphi 5 for Professionals / DELPHI5.iso / Runimage / Delphi50 / Demos / ToolsAPI / Editor Keybinding / bufferlist.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-08-11  |  60.0 KB  |  1,607 lines

  1. unit BufferList;
  2.  
  3. interface
  4.  
  5. procedure Register;
  6.  
  7. implementation
  8.  
  9. uses Windows, Classes, SysUtils, ToolsAPI, Menus, Forms, Dialogs, Controls,
  10.   BufferListForm, BaseBindings, SaveKeyMacro, ActiveX;
  11.  
  12. type
  13.   TBufferList = class(TNotifierObject, IUnknown, IOTANotifier,
  14.     IOTAKeyboardBinding)
  15.     procedure BufferListProc(const Context: IOTAKeyContext; KeyCode: TShortCut;
  16.       var BindingResult: TKeyBindingResult);
  17.     function GetBindingType: TBindingType;
  18.     function GetDisplayName: string;
  19.     function GetName: string;
  20.     procedure BindKeyboard(const BindingServices: IOTAKeyBindingServices);
  21.   end;
  22.  
  23.   TClassicBinding = class(TBaseBindings, IOTAKeyboardBinding)
  24.   protected
  25.     procedure AdjustBlockCase(const Context: IOTAKeyContext; KeyCode: TShortCut;
  26.       var BindingResult: TKeyBindingResult);
  27.     procedure AdjustWordCase(const Context: IOTAKeyContext; KeyCode: TShortCut;
  28.       var BindingResult: TKeyBindingResult);
  29.     procedure BackspaceDelete(const Context: IOTAKeyContext; KeyCode: TShortCut;
  30.       var BindingResult: TKeyBindingResult);
  31.     procedure ClassicBlockDelete(const Context: IOTAKeyContext; KeyCode: TShortCut;
  32.       var BindingResult: TKeyBindingResult);
  33.     procedure ClassicDeleteLine(const Context: IOTAKeyContext; KeyCode: TShortCut;
  34.       var BindingResult: TKeyBindingResult);
  35.     procedure ClassicMarkWord(const Context: IOTAKeyContext; KeyCode: TShortCut;
  36.       var BindingResult: TKeyBindingResult);
  37.     procedure ClassicMarkToViewBottom(const Context: IOTAKeyContext; KeyCode: TShortCut;
  38.       var BindingResult: TKeyBindingResult);
  39.     procedure ClassicMarkToViewTop(const Context: IOTAKeyContext; KeyCode: TShortCut;
  40.       var BindingResult: TKeyBindingResult);
  41.     procedure ClassicMarkToBOF(const Context: IOTAKeyContext; KeyCode: TShortCut;
  42.       var BindingResult: TKeyBindingResult);
  43.     procedure ClassicMarkToBOL(const Context: IOTAKeyContext; KeyCode: TShortCut;
  44.       var BindingResult: TKeyBindingResult);
  45.     procedure ClassicMarkToEOF(const Context: IOTAKeyContext; KeyCode: TShortCut;
  46.       var BindingResult: TKeyBindingResult);
  47.     procedure ClassicMarkToEOL(const Context: IOTAKeyContext; KeyCode: TShortCut;
  48.       var BindingResult: TKeyBindingResult);
  49.     procedure ClassicMoveBlock(const Context: IOTAKeyContext; KeyCode: TShortCut;
  50.       var BindingResult: TKeyBindingResult);
  51.     procedure ClassicToggleCase(const Context: IOTAKeyContext; KeyCode: TShortCut;
  52.       var BindingResult: TKeyBindingResult);
  53.     procedure CopyBlock(const Context: IOTAKeyContext; KeyCode: TShortCut;
  54.       var BindingResult: TKeyBindingResult);
  55.     procedure CursorLeft(const Context: IOTAKeyContext; KeyCode: TShortCut;
  56.       var BindingResult: TKeyBindingResult);
  57.     procedure CursorRight(const Context: IOTAKeyContext; KeyCode: TShortCut;
  58.       var BindingResult: TKeyBindingResult);
  59.     procedure DeleteChar(const Context: IOTAKeyContext; KeyCode: TShortCut;
  60.       var BindingResult: TKeyBindingResult);
  61.     procedure DeleteToEOL(const Context: IOTAKeyContext; KeyCode: TShortCut;
  62.       var BindingResult: TKeyBindingResult);
  63.     procedure DeleteWordLeft(const Context: IOTAKeyContext; KeyCode: TShortCut;
  64.       var BindingResult: TKeyBindingResult);
  65.     procedure DeleteWordRight(const Context: IOTAKeyContext; KeyCode: TShortCut;
  66.       var BindingResult: TKeyBindingResult);
  67.     procedure EndCursor(const Context: IOTAKeyContext; KeyCode: TShortCut;
  68.       var BindingResult: TKeyBindingResult);
  69.     procedure GotoBookmark(const Context: IOTAKeyContext; KeyCode: TShortCut;
  70.       var BindingResult: TKeyBindingResult);
  71.     procedure HomeCursor(const Context: IOTAKeyContext; KeyCode: TShortCut;
  72.       var BindingResult: TKeyBindingResult);
  73.     procedure IndentBlock(const Context: IOTAKeyContext; KeyCode: TShortCut;
  74.       var BindingResult: TKeyBindingResult);
  75.     procedure InsertCharacter(const Context: IOTAKeyContext; KeyCode: TShortCut;
  76.       var BindingResult: TKeyBindingResult);
  77.     procedure InsertFile(const Context: IOTAKeyContext; KeyCode: TShortCut;
  78.       var BindingResult: TKeyBindingResult);
  79.     procedure InsertLiteralKey(const Context: IOTAKeyContext; KeyCode: TShortCut;
  80.       var BindingResult: TKeyBindingResult);
  81.     procedure InsertTab(const Context: IOTAKeyContext; KeyCode: TShortCut;
  82.       var BindingResult: TKeyBindingResult);
  83.     procedure LineDown(const Context: IOTAKeyContext; KeyCode: TShortCut;
  84.       var BindingResult: TKeyBindingResult);
  85.     procedure LineUp(const Context: IOTAKeyContext; KeyCode: TShortCut;
  86.       var BindingResult: TKeyBindingResult);
  87.     procedure LiteralKeyProc(const Context: IOTAKeyContext; KeyCode: TShortCut;
  88.       var BindingResult: TKeyBindingResult);
  89.     procedure LoadKeyMacro(const Context: IOTAKeyContext; KeyCode: TShortCut;
  90.       var BindingResult: TKeyBindingResult);
  91.     procedure MarkBlockBegin(const Context: IOTAKeyContext; KeyCode: TShortCut;
  92.       var BindingResult: TKeyBindingResult);
  93.     procedure MarkBlockEnd(const Context: IOTAKeyContext; KeyCode: TShortCut;
  94.       var BindingResult: TKeyBindingResult);
  95.     procedure MarkLine(const Context: IOTAKeyContext; KeyCode: TShortCut;
  96.       var BindingResult: TKeyBindingResult);
  97.     procedure MarkToPageDown(const Context: IOTAKeyContext; KeyCode: TShortCut;
  98.       var BindingResult: TKeyBindingResult);
  99.     procedure MarkToPageUp(const Context: IOTAKeyContext; KeyCode: TShortCut;
  100.       var BindingResult: TKeyBindingResult);
  101.     procedure MarkToRelativeHoriz(const Context: IOTAKeyContext; KeyCode: TShortCut;
  102.       var BindingResult: TKeyBindingResult);
  103.     procedure MarkToRelativeVert(const Context: IOTAKeyContext; KeyCode: TShortCut;
  104.       var BindingResult: TKeyBindingResult);
  105.     procedure MarkToWordLeft(const Context: IOTAKeyContext; KeyCode: TShortCut;
  106.       var BindingResult: TKeyBindingResult);
  107.     procedure MarkToWordRight(const Context: IOTAKeyContext; KeyCode: TShortCut;
  108.       var BindingResult: TKeyBindingResult);
  109.     procedure MoveCursorHorizontal(const Context: IOTAKeyContext; KeyCode: TShortCut;
  110.       var BindingResult: TKeyBindingResult);
  111.     procedure MoveCursorToBOF(const Context: IOTAKeyContext; KeyCode: TShortCut;
  112.       var BindingResult: TKeyBindingResult);
  113.     procedure MoveCursorToBOL(const Context: IOTAKeyContext; KeyCode: TShortCut;
  114.       var BindingResult: TKeyBindingResult);
  115.     procedure MoveCursorToEOF(const Context: IOTAKeyContext; KeyCode: TShortCut;
  116.       var BindingResult: TKeyBindingResult);
  117.     procedure MoveCursorToEOL(const Context: IOTAKeyContext; KeyCode: TShortCut;
  118.       var BindingResult: TKeyBindingResult);
  119.     procedure MoveCursorToLastEdit(const Context: IOTAKeyContext; KeyCode: TShortCut;
  120.       var BindingResult: TKeyBindingResult);
  121.     procedure MoveCursorToMarkBegin(const Context: IOTAKeyContext; KeyCode: TShortCut;
  122.       var BindingResult: TKeyBindingResult);
  123.     procedure MoveCursorToMarkEnd(const Context: IOTAKeyContext; KeyCode: TShortCut;
  124.       var BindingResult: TKeyBindingResult);
  125.     procedure MoveCursorVertical(const Context: IOTAKeyContext; KeyCode: TShortCut;
  126.       var BindingResult: TKeyBindingResult);
  127.     procedure MoveLineViewBottom(const Context: IOTAKeyContext; KeyCode: TShortCut;
  128.       var BindingResult: TKeyBindingResult);
  129.     procedure MoveLineViewTop(const Context: IOTAKeyContext; KeyCode: TShortCut;
  130.       var BindingResult: TKeyBindingResult);
  131.     procedure PageDown(const Context: IOTAKeyContext; KeyCode: TShortCut;
  132.       var BindingResult: TKeyBindingResult);
  133.     procedure PageUp(const Context: IOTAKeyContext; KeyCode: TShortCut;
  134.       var BindingResult: TKeyBindingResult);
  135.     procedure SetBookmark(const Context: IOTAKeyContext; KeyCode: TShortCut;
  136.       var BindingResult: TKeyBindingResult);
  137.     procedure Scroll(const Context: IOTAKeyContext; KeyCode: TShortCut;
  138.       var BindingResult: TKeyBindingResult);
  139.     procedure ToggleBlock(const Context: IOTAKeyContext; KeyCode: TShortCut;
  140.       var BindingResult: TKeyBindingResult);
  141.     procedure ToggleInsertMode(const Context: IOTAKeyContext; KeyCode: TShortCut;
  142.       var BindingResult: TKeyBindingResult);
  143.     procedure ToggleMacroRecord(const Context: IOTAKeyContext; KeyCode: TShortCut;
  144.       var BindingResult: TKeyBindingResult);
  145.     procedure WordLeft(const Context: IOTAKeyContext; KeyCode: TShortCut;
  146.       var BindingResult: TKeyBindingResult);
  147.     procedure WordRight(const Context: IOTAKeyContext; KeyCode: TShortCut;
  148.       var BindingResult: TKeyBindingResult);
  149.   public
  150.     function GetBindingType: TBindingType;
  151.     function GetDisplayName: string;
  152.     function GetName: string;
  153.     procedure BindKeyboard(const BindingServices: IOTAKeyBindingServices);
  154.   end;
  155.  
  156. resourcestring
  157.   sBufferList = 'Buffer List';
  158.   sNewIDEClassic = 'New IDE Classic';
  159.  
  160. procedure Register;
  161. begin
  162.   (BorlandIDEServices as IOTAKeyBoardServices).AddKeyboardBinding(TBufferList.Create);
  163.   (BorlandIDEServices as IOTAKeyBoardServices).AddKeyboardBinding(TClassicBinding.Create);
  164. end;
  165.  
  166. { TBufferList }
  167.  
  168. procedure TBufferList.BindKeyboard(const BindingServices: IOTAKeyBindingServices);
  169. begin
  170.   BindingServices.AddKeyBinding([ShortCut(Ord('B'), [ssCtrl])], BufferListProc, nil);
  171. end;
  172.  
  173. procedure TBufferList.BufferListProc(const Context: IOTAKeyContext;
  174.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  175. var
  176.   I: Integer;
  177.   InterfaceList: IInterfaceList;
  178.   Iter: IOTAEditBufferIterator;
  179.   Buffer: IOTAEditBuffer;
  180. begin
  181.   with TBufferListFrm.Create(Application) do
  182.   try
  183.     InterfaceList := TInterfaceList.Create;
  184.     Context.KeyboardServices.EditorServices.GetEditBufferIterator(Iter);
  185.     for I := 0 to Iter.Count - 1 do
  186.     begin
  187.       Buffer := Iter.EditBuffers[I];
  188.       InterfaceList.Add(Buffer);
  189.       BufferListBox.Items.Add(Buffer.FileName);
  190.     end;
  191.     if BufferListBox.Items.Count > 1 then
  192.       BufferListBox.ItemIndex := 1
  193.     else BufferListBox.ItemIndex := 0;
  194.     Iter := nil;
  195.     if ShowModal = mrOK then
  196.       (InterfaceList[BufferListBox.ItemIndex] as IOTAEditBuffer).Show;
  197.   finally
  198.     Free;
  199.   end;
  200.   BindingResult := krHandled;
  201. end;
  202.  
  203. function TBufferList.GetBindingType: TBindingType;
  204. begin
  205.   Result := btPartial;
  206. end;
  207.  
  208. function TBufferList.GetDisplayName: string;
  209. begin
  210.   Result := sBufferList;
  211. end;
  212.  
  213. function TBufferList.GetName: string;
  214. begin
  215.   Result := 'Borland.BufferList';  //do not localize
  216. end;
  217.  
  218. { TClassicBinding }
  219.  
  220. { Do no localize the following strings }
  221.  
  222. procedure TClassicBinding.BindKeyboard(const BindingServices: IOTAKeyBindingServices);
  223. begin
  224.   BindingServices.AddKeyBinding([ShortCut(VK_F5, [ssAlt])], DebugInspect, nil);
  225.   BindingServices.AddKeyBinding([ShortCut(VK_F1, [ssCtrl])], HelpKeyword, nil);
  226.   BindingServices.AddKeyBinding([ShortCut(VK_F7, [ssCtrl])], AddWatchAtCursor, nil);
  227.   BindingServices.AddMenuCommand(mcAddWatchAtCursor, AddWatchAtCursor, nil);
  228.   BindingServices.AddMenuCommand(mcInspectAtCursor, DebugInspect, nil);
  229.  
  230.   BindingServices.AddKeyBinding([ShortCut(Ord('A'), [ssCtrl])], WordLeft, nil);
  231.   BindingServices.AddKeyBinding([ShortCut(Ord('C'), [ssCtrl])], PageDown, nil);
  232.   BindingServices.AddKeyBinding([ShortCut(Ord('D'), [ssCtrl])], CursorRight, nil);
  233.   BindingServices.AddKeyBinding([ShortCut(Ord('E'), [ssCtrl])], LineUp, nil);
  234.   BindingServices.AddKeyBinding([ShortCut(Ord('F'), [ssCtrl])], WordRight, nil);
  235.   BindingServices.AddKeyBinding([ShortCut(Ord('G'), [ssCtrl])], DeleteChar, nil);
  236.   BindingServices.AddKeyBinding([ShortCut(Ord('H'), [ssCtrl])], BackSpaceDelete, nil);
  237.   BindingServices.AddKeyBinding([ShortCut(Ord('I'), [ssCtrl])], InsertTab, nil);
  238.   BindingServices.AddKeyBinding([ShortCut(Ord('J'), [ssCtrl])], CodeTemplate, nil);
  239.   BindingServices.AddKeyBinding([ShortCut(Ord('L'), [ssCtrl])], SearchAgain, nil, kfImplicits, '', 'SearchAgainItem');
  240.   BindingServices.AddKeyBinding([ShortCut(Ord('R'), [ssCtrl])], PageUp, nil);
  241.   BindingServices.AddKeyBinding([ShortCut(Ord('S'), [ssCtrl])], CursorLeft, nil);
  242.   BindingServices.AddKeyBinding([ShortCut(Ord('T'), [ssCtrl])], DeleteWordRight, nil);
  243.   BindingServices.AddKeyBinding([ShortCut(Ord('V'), [ssCtrl])], ToggleInsertMode, nil);
  244.   BindingServices.AddKeyBinding([ShortCut(Ord('W'), [ssCtrl])], Scroll, Pointer(-1));
  245.   BindingServices.AddKeyBinding([ShortCut(Ord('X'), [ssCtrl])], LineDown, nil);
  246.   BindingServices.AddKeyBinding([ShortCut(Ord('Y'), [ssCtrl])], ClassicDeleteLine, nil);
  247.   BindingServices.AddKeyBinding([ShortCut(Ord('Z'), [ssCtrl])], Scroll, Pointer(1));
  248.   BindingServices.AddMenuCommand(mcRepeatSearch, SearchAgain, nil);
  249.  
  250.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('B'), [ssCtrl])], MarkBlockBegin, nil);
  251.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('C'), [ssCtrl])], CopyBlock, nil);
  252.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('E'), [ssCtrl])], AdjustWordCase, Pointer(1));
  253.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('F'), [ssCtrl])], AdjustWordCase, nil);
  254.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('H'), [ssCtrl])], ToggleBlock, nil);
  255.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('I'), [ssCtrl])], IndentBlock, nil);
  256.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('K'), [ssCtrl])], MarkBlockEnd, nil);
  257.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('L'), [ssCtrl])], MarkLine, nil);
  258.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('N'), [ssCtrl])], AdjustBlockCase, nil);
  259.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('O'), [ssCtrl])], AdjustBlockCase, Pointer(1));
  260.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('P'), [ssCtrl])], Print, nil);
  261.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('R'), [ssCtrl])], InsertFile, nil);
  262.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('T'), [ssCtrl])], ClassicMarkWord, nil);
  263.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('U'), [ssCtrl])], IndentBlock, Pointer(1));
  264.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('V'), [ssCtrl])], ClassicMoveBlock, nil);
  265.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('W'), [ssCtrl])], BlockSave, nil);
  266.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('Y'), [ssCtrl])], ClassicBlockDelete, nil);
  267.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('0'), [])], SetBookmark, nil);
  268.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('1'), [])], SetBookmark, Pointer(1));
  269.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('2'), [])], SetBookmark, Pointer(2));
  270.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('3'), [])], SetBookmark, Pointer(3));
  271.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('4'), [])], SetBookmark, Pointer(4));
  272.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('5'), [])], SetBookmark, Pointer(5));
  273.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('6'), [])], SetBookmark, Pointer(6));
  274.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('7'), [])], SetBookmark, Pointer(7));
  275.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('8'), [])], SetBookmark, Pointer(8));
  276.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('9'), [])], SetBookmark, Pointer(9));
  277.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('0'), [ssCtrl])], SetBookmark, nil);
  278.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('1'), [ssCtrl])], SetBookmark, Pointer(1));
  279.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('2'), [ssCtrl])], SetBookmark, Pointer(2));
  280.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('3'), [ssCtrl])], SetBookmark, Pointer(3));
  281.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('4'), [ssCtrl])], SetBookmark, Pointer(4));
  282.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('5'), [ssCtrl])], SetBookmark, Pointer(5));
  283.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('6'), [ssCtrl])], SetBookmark, Pointer(6));
  284.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('7'), [ssCtrl])], SetBookmark, Pointer(7));
  285.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('8'), [ssCtrl])], SetBookmark, Pointer(8));
  286.   BindingServices.AddKeyBinding([ShortCut(Ord('K'), [ssCtrl]), ShortCut(Ord('9'), [ssCtrl])], SetBookmark, Pointer(9));
  287.  
  288.   BindingServices.AddKeyBinding([ShortCut(Ord('N'), [ssCtrl])], OpenLine, nil);
  289.  
  290.   BindingServices.AddKeyBinding([ShortCut(Ord('O'), [ssCtrl]), ShortCut(Ord('A'), [ssCtrl])], OpenFileAtCursor, nil);
  291.   BindingServices.AddKeyBinding([ShortCut(Ord('O'), [ssCtrl]), ShortCut(Ord('B'), [ssCtrl])], BrowseSymbolAtCursor, nil);
  292.   BindingServices.AddKeyBinding([ShortCut(Ord('O'), [ssCtrl]), ShortCut(Ord('C'), [ssCtrl])], SetBlockStyle, Pointer(btColumn));
  293.   BindingServices.AddKeyBinding([ShortCut(Ord('O'), [ssCtrl]), ShortCut(Ord('G'), [ssCtrl])], GotoLine, nil);
  294.   BindingServices.AddKeyBinding([ShortCut(Ord('O'), [ssCtrl]), ShortCut(Ord('I'), [ssCtrl])], SetBlockStyle, Pointer(btInclusive));
  295.   BindingServices.AddKeyBinding([ShortCut(Ord('O'), [ssCtrl]), ShortCut(Ord('K'), [ssCtrl])], SetBlockStyle, Pointer(btNonInclusive));
  296.   BindingServices.AddKeyBinding([ShortCut(Ord('O'), [ssCtrl]), ShortCut(Ord('L'), [ssCtrl])], SetBlockStyle, Pointer(btLine));
  297.   BindingServices.AddKeyBinding([ShortCut(Ord('O'), [ssCtrl]), ShortCut(Ord('O'), [ssCtrl])], InsertCompilerOptions, nil);
  298.   BindingServices.AddKeyBinding([ShortCut(Ord('O'), [ssCtrl]), ShortCut(Ord('U'), [ssCtrl])], ClassicToggleCase, nil);
  299.   BindingServices.AddMenuCommand(mcGotoLine, GotoLine, nil);
  300.  
  301.   BindingServices.AddKeyBinding([ShortCut(Ord('P'), [ssCtrl])], InsertLiteralKey, nil);
  302.  
  303.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('A'), [ssCtrl])], SearchReplace, nil);
  304.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('B'), [ssCtrl])], MoveCursorToMarkBegin, nil);
  305.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('C'), [ssCtrl])], MoveCursorToEOF, nil);
  306.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('D'), [ssCtrl])], MoveCursorToEOL, nil);
  307.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('E'), [ssCtrl])], HomeCursor, nil);
  308.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('F'), [ssCtrl])], SearchFind, nil);
  309.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('G'), [ssCtrl])], NullCmd, nil);
  310.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('H'), [ssCtrl])], NullCmd, nil);
  311.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('I'), [ssCtrl])], NullCmd, nil);
  312.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('J'), [ssCtrl])], NullCmd, nil);
  313.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('K'), [ssCtrl])], MoveCursorToMarkEnd, nil);
  314.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('P'), [ssCtrl])], MoveCursorToLastEdit, nil);
  315.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('R'), [ssCtrl])], MoveCursorToBOF, nil);
  316.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('S'), [ssCtrl])], MoveCursorToBOL, nil);
  317.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('T'), [ssCtrl])], MoveLineViewTop, nil);
  318.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('U'), [ssCtrl])], MoveLineViewBottom, nil);
  319.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('X'), [ssCtrl])], EndCursor, nil);
  320.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('Y'), [ssCtrl])], DeleteToEOL, nil);
  321.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('0'), [])], GotoBookmark, nil);
  322.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('1'), [])], GotoBookmark, Pointer(1));
  323.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('2'), [])], GotoBookmark, Pointer(2));
  324.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('3'), [])], GotoBookmark, Pointer(3));
  325.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('4'), [])], GotoBookmark, Pointer(4));
  326.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('5'), [])], GotoBookmark, Pointer(5));
  327.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('6'), [])], GotoBookmark, Pointer(6));
  328.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('7'), [])], GotoBookmark, Pointer(7));
  329.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('8'), [])], GotoBookmark, Pointer(8));
  330.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('9'), [])], GotoBookmark, Pointer(9));
  331.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('0'), [ssCtrl])], GotoBookmark, nil);
  332.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('1'), [ssCtrl])], GotoBookmark, Pointer(1));
  333.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('2'), [ssCtrl])], GotoBookmark, Pointer(2));
  334.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('3'), [ssCtrl])], GotoBookmark, Pointer(3));
  335.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('4'), [ssCtrl])], GotoBookmark, Pointer(4));
  336.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('5'), [ssCtrl])], GotoBookmark, Pointer(5));
  337.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('6'), [ssCtrl])], GotoBookmark, Pointer(6));
  338.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('7'), [ssCtrl])], GotoBookmark, Pointer(7));
  339.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('8'), [ssCtrl])], GotoBookmark, Pointer(8));
  340.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('9'), [ssCtrl])], GotoBookmark, Pointer(9));
  341.   BindingServices.AddMenuCommand(mcReplace, SearchReplace, nil);
  342.   BindingServices.AddMenuCommand(mcGetFindString, SearchFind, nil);
  343.   BindingServices.AddMenuCommand(mcMoveToMark0, GotoBookmark, nil);
  344.   BindingServices.AddMenuCommand(mcMoveToMark1, GotoBookmark, Pointer(1));
  345.   BindingServices.AddMenuCommand(mcMoveToMark2, GotoBookmark, Pointer(2));
  346.   BindingServices.AddMenuCommand(mcMoveToMark3, GotoBookmark, Pointer(3));
  347.   BindingServices.AddMenuCommand(mcMoveToMark4, GotoBookmark, Pointer(4));
  348.   BindingServices.AddMenuCommand(mcMoveToMark5, GotoBookmark, Pointer(5));
  349.   BindingServices.AddMenuCommand(mcMoveToMark6, GotoBookmark, Pointer(6));
  350.   BindingServices.AddMenuCommand(mcMoveToMark7, GotoBookmark, Pointer(7));
  351.   BindingServices.AddMenuCommand(mcMoveToMark8, GotoBookmark, Pointer(8));
  352.   BindingServices.AddMenuCommand(mcMoveToMark9, GotoBookmark, Pointer(9));
  353.   BindingServices.AddMenuCommand(mcSetMark0, SetBookmark, nil);
  354.   BindingServices.AddMenuCommand(mcSetMark1, SetBookmark, Pointer(1));
  355.   BindingServices.AddMenuCommand(mcSetMark2, SetBookmark, Pointer(2));
  356.   BindingServices.AddMenuCommand(mcSetMark3, SetBookmark, Pointer(3));
  357.   BindingServices.AddMenuCommand(mcSetMark4, SetBookmark, Pointer(4));
  358.   BindingServices.AddMenuCommand(mcSetMark5, SetBookmark, Pointer(5));
  359.   BindingServices.AddMenuCommand(mcSetMark6, SetBookmark, Pointer(6));
  360.   BindingServices.AddMenuCommand(mcSetMark7, SetBookmark, Pointer(7));
  361.   BindingServices.AddMenuCommand(mcSetMark8, SetBookmark, Pointer(8));
  362.   BindingServices.AddMenuCommand(mcSetMark9, SetBookmark, Pointer(9));
  363.  
  364.   BindingServices.AddKeyBinding([ShortCut(VK_RETURN, [ssCtrl])], OpenFileAtCursor, nil, kfImplicits, '', 'ecOpenFileAtCursor');
  365.   BindingServices.AddKeyBinding([ShortCut(VK_SPACE, [ssCtrl])], CodeCompletion, Pointer(csCodeList or csManual));
  366.   BindingServices.AddKeyBinding([ShortCut(VK_PRIOR, [ssCtrl])], MoveCursorToBOF, nil);
  367.   BindingServices.AddKeyBinding([ShortCut(VK_NEXT, [ssCtrl])], MoveCursorToEOF, nil);
  368.   BindingServices.AddKeyBinding([ShortCut(VK_RIGHT, [ssCtrl])], WordRight, nil);
  369.   BindingServices.AddKeyBinding([ShortCut(VK_LEFT, [ssCtrl])], WordLeft, nil);
  370.   BindingServices.AddKeyBinding([ShortCut(VK_HOME, [ssCtrl])], HomeCursor, nil);
  371.   BindingServices.AddKeyBinding([ShortCut(VK_END, [ssCtrl])], EndCursor, nil);
  372.   BindingServices.AddKeyBinding([ShortCut(VK_BACK, [ssctrl])], DeleteWordLeft, nil);
  373.  
  374.   BindingServices.AddKeyBinding([ShortCut(VK_TAB, [])], InsertTab, nil);
  375.   BindingServices.AddKeyBinding([ShortCut(VK_BACK, [])], BackSpaceDelete, nil);
  376.   BindingServices.AddKeyBinding([ShortCut(VK_HOME, [])], MoveCursorToBOL, nil);
  377.   BindingServices.AddKeyBinding([ShortCut(VK_END, [])], MoveCursorToEOL, nil);
  378.   BindingServices.AddKeyBinding([ShortCut(VK_DELETE, [])], DeleteChar, nil);
  379.   BindingServices.AddKeyBinding([ShortCut(VK_INSERT, [])], ToggleInsertMode, nil);
  380.  
  381.   BindingServices.AddKeyBinding([ShortCut(VK_DOWN, [])], MoveCursorVertical, Pointer(1));
  382.   BindingServices.AddKeyBinding([ShortCut(VK_UP, [])], MoveCursorVertical, Pointer(-1));
  383.   BindingServices.AddKeyBinding([ShortCut(VK_RIGHT, [])], MoveCursorHorizontal, Pointer(1));
  384.   BindingServices.AddKeyBinding([ShortCut(VK_LEFT, [])], MoveCursorHorizontal, Pointer(-1));
  385.  
  386.   BindingServices.AddKeyBinding([ShortCut(VK_PRIOR, [])], PageUp, nil);
  387.   BindingServices.AddKeyBinding([ShortCut(VK_NEXT, [])], PageDown, nil);
  388.  
  389.   BindingServices.AddKeyBinding([ShortCut(VK_RETURN, [])], InsertCharacter, Pointer($0D));
  390.   BindingServices.AddKeyBinding([ShortCut(VK_UP, [])], MoveCursorVertical, Pointer(-1));
  391.  
  392.   BindingServices.AddKeyBinding([ShortCut(VK_BACK, [ssShift])], BackSpaceDelete, nil);
  393.   BindingServices.AddKeyBinding([ShortCut(VK_LEFT, [ssShift])], MarkToRelativeHoriz, Pointer(-1));
  394.   BindingServices.AddKeyBinding([ShortCut(VK_RIGHT, [ssShift])], MarkToRelativeHoriz, Pointer(1));
  395.   BindingServices.AddKeyBinding([ShortCut(VK_UP, [ssShift])], MarkToRelativeVert, Pointer(-1));
  396.   BindingServices.AddKeyBinding([ShortCut(VK_DOWN, [ssShift])], MarkToRelativeVert, Pointer(1));
  397.   BindingServices.AddKeyBinding([ShortCut(VK_END, [ssShift])], ClassicMarkToEOL, nil);
  398.   BindingServices.AddKeyBinding([ShortCut(VK_HOME, [ssShift])], ClassicMarkToBOL, nil);
  399.   BindingServices.AddKeyBinding([ShortCut(VK_PRIOR, [ssShift])], MarkToPageUp, nil);
  400.   BindingServices.AddKeyBinding([ShortCut(VK_NEXT, [ssShift])], MarkToPageDown, nil);
  401.   BindingServices.AddKeyBinding([ShortCut(VK_RETURN, [ssShift])], InsertCharacter, Pointer($0D));
  402.  
  403.   BindingServices.AddKeyBinding([ShortCut(VK_INSERT, [ssShift])], ClipPaste, nil, kfImplicits, '', 'EditPasteItem');
  404.   BindingServices.AddKeyBinding([ShortCut(VK_INSERT, [ssCtrl])], ClipCopy, nil, kfImplicits, '', 'EditCopyItem');
  405.   BindingServices.AddKeyBinding([ShortCut(VK_DELETE, [ssShift])], ClipCut, nil, kfImplicits, '', 'EditCutItem');
  406.   BindingServices.AddKeyBinding([ShortCut(VK_DELETE, [ssCtrl])], ClipClear, nil, kfImplicits, '', 'EditDeleteItem');
  407.   BindingServices.AddMenuCommand(mcClipPaste, ClipPaste, nil);
  408.   BindingServices.AddMenuCommand(mcClipCopy, ClipCopy, nil);
  409.   BindingServices.AddMenuCommand(mcClipCut, ClipCut, nil);
  410.   BindingServices.AddMenuCommand(mcClipClear, ClipClear, nil);
  411.  
  412.   BindingServices.AddKeyBinding([ShortCut(VK_LEFT, [ssShift, ssCtrl])], MarkToWordLeft, nil);
  413.   BindingServices.AddKeyBinding([ShortCut(VK_RIGHT, [ssShift, ssCtrl])], markToWordRight, nil);
  414.   BindingServices.AddKeyBinding([ShortCut(Ord('C'), [ssShift, ssCtrl])], ClassComplete, nil);
  415.   BindingServices.AddKeyBinding([ShortCut(Ord('G'), [ssShift, ssCtrl])], InsertNewGUID, nil);
  416.   BindingServices.AddKeyBinding([ShortCut(Ord('S'), [ssShift, ssCtrl])], IncrementalSearch, nil, kfImplicits, '', 'SearchIncrementalItem');
  417.   BindingServices.AddKeyBinding([ShortCut(VK_SPACE, [ssShift, ssCtrl])], CodeCompletion, Pointer(csParamList or csManual));
  418.   BindingServices.AddKeyBinding([ShortCut(VK_END, [ssShift, ssCtrl])], ClassicMarkToViewBottom, nil);
  419.   BindingServices.AddKeyBinding([ShortCut(VK_HOME, [ssShift, ssCtrl])], ClassicMarkToViewTop, nil);
  420.   BindingServices.AddKeyBinding([ShortCut(VK_PRIOR, [ssShift, ssCtrl])], ClassicMarkToBOF, nil);
  421.   BindingServices.AddKeyBinding([ShortCut(VK_NEXT, [ssShift, ssCtrl])], ClassicMarkToEOF, nil);
  422.   BindingServices.AddKeyBinding([ShortCut(VK_UP, [ssShift, ssCtrl])], ClassNavigate, nil);
  423.   BindingServices.AddKeyBinding([ShortCut(VK_DOWN, [ssShift, ssCtrl])], ClassNavigate, nil);
  424.   BindingServices.AddKeyBinding([ShortCut(Ord('R'), [ssShift, ssCtrl])], ToggleMacroRecord, nil);
  425.   BindingServices.AddKeyBinding([ShortCut(Ord('P'), [ssShift, ssCtrl, ssAlt])], LoadKeyMacro, nil);
  426.   BindingServices.AddMenuCommand(mcIncrementalSearch, IncrementalSearch, nil);
  427.  
  428.   BindingServices.AddKeyBinding([TextToShortCut('.')], AutoCodeInsight, Pointer(Ord('.')));
  429.   BindingServices.AddKeyBinding([ShortCut(Ord('>'), [])], AutoCodeInsight, Pointer(Ord('>')));
  430.   BindingServices.AddKeyBinding([TextToShortCut('(')], AutoCodeInsight, Pointer(Ord('(')));
  431.  
  432. {  BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('y'), [])], DeleteToEOL, nil);
  433.   BindingServices.AddKeyBinding([ShortCut(Ord('Q'), [ssCtrl]), ShortCut(Ord('Y'), [])], DeleteToEOL, nil);}
  434.   // Create the literal key table.. Note: needs at least one keybinding in order to be created
  435.   BindingServices.AddKeyBinding([ShortCut(0, [])], NullCmd, nil, 7, 'LiteralKeyTable');
  436.   BindingServices.SetDefaultKeyProc(LiteralKeyProc, nil, 'LiteralKeyTable');
  437. end;
  438.  
  439. function TClassicBinding.GetBindingType: TBindingType;
  440. begin
  441. {$IFDEF DEBUG}
  442.    Result := btPartial;
  443. {$ELSE}
  444.   Result := btComplete;
  445. {$ENDIF}
  446. end;
  447.  
  448. function TClassicBinding.GetDisplayName: string;
  449. begin
  450.   Result := sNewIDEClassic;
  451. end;
  452.  
  453. function TClassicBinding.GetName: string;
  454. begin
  455.   Result := 'Borland.NewClassic'; //do not localize
  456. end;
  457.  
  458. procedure TClassicBinding.DeleteToEOL(const Context: IOTAKeyContext;
  459.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  460. var
  461.   Pos: IOTAEditPosition;
  462.   Block: IOTAEditBlock;
  463. begin
  464.   Pos := Context.EditBuffer.EditPosition;
  465.   Block := Context.EditBuffer.EditBlock;
  466.   Block.Visible := False;
  467.   Block.Save;
  468.   try
  469.     Block.Style := btNonInclusive;
  470.     Block.BeginBlock;
  471.     Pos.MoveEOL;
  472.     Block.EndBlock;
  473.     Block.Delete;
  474.   finally
  475.     Block.Restore;
  476.   end;
  477.   BindingResult := krHandled;
  478. end;
  479.  
  480. procedure TClassicBinding.WordLeft(const Context: IOTAKeyContext;
  481.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  482. begin
  483.   Context.EditBuffer.EditPosition.MoveCursor(mmSkipLeft or mmSkipNonWord);
  484.   Context.EditBuffer.EditPosition.MoveCursor(mmSkipLeft or mmSkipWord or mmSkipStream);
  485.   BindingResult := krHandled;
  486. end;
  487.  
  488. procedure TClassicBinding.WordRight(const Context: IOTAKeyContext;
  489.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  490. begin
  491.   Context.EditBuffer.EditPosition.MoveCursor(mmSkipRight or mmSkipWord or mmSkipStream);
  492.   Context.EditBuffer.EditPosition.MoveCursor(mmSkipRight or mmSkipNonWord);
  493.   BindingResult := krHandled;
  494. end;
  495.  
  496. const
  497.   BOOKMARK_ID_SYSTEM_ONE   = 19;
  498.   BOOKMARK_ID_SYSTEM_TWO   = 18;
  499.   BOOKMARK_ID_SYSTEM_THREE = 17;
  500.  
  501. procedure TClassicBinding.DeleteWordLeft(const Context: IOTAKeyContext;
  502.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  503. var
  504.   EP: IOTAEditPosition;
  505.   EB: IOTAEditBlock;
  506.   EV: IOTAEditView;
  507.   Blocked: Boolean;
  508. begin
  509.   EV := Context.EditBuffer.TopView;
  510.   EB := EV.Block;
  511.   EP := EV.Position;
  512.   if (EB.Style <> btNonInclusive) or (EB.Size <> 0) then
  513.   begin
  514.     EB.Save;
  515.     try
  516.       EP.Save;
  517.       try
  518.         EP.Move(EB.StartingRow, EB.StartingColumn);
  519.         EV.BookmarkRecord(BOOKMARK_ID_SYSTEM_ONE);
  520.         EP.Move(EB.EndingRow,EB.EndingColumn);
  521.         EV.BookmarkRecord(BOOKMARK_ID_SYSTEM_TWO);
  522.       finally
  523.         EP.Restore;
  524.       end;
  525.     finally
  526.       EB.Restore;
  527.     end;
  528.     Blocked := True;
  529.   end else
  530.     Blocked := False;
  531.   EB.Style := btNonInclusive;
  532.   EB.Reset;
  533.   EB.EndBlock;
  534.   EP.MoveCursor(mmSkipLeft or mmSkipNonWord);
  535.   EP.MoveCursor(mmSkipLeft or mmSkipWord);
  536.   EB.BeginBlock;
  537.   EB.Delete;
  538.   if Blocked then
  539.   begin
  540.     EB.Style := btNonInclusive;
  541.     EP.Save;
  542.     try
  543.       EV.BookmarkGoto(BOOKMARK_ID_SYSTEM_ONE);
  544.       EB.BeginBlock;
  545.       EV.BookmarkGoto(BOOKMARK_ID_SYSTEM_TWO);
  546.       EB.EndBlock;
  547.     finally
  548.       EP.Restore;
  549.     end;
  550.   end;
  551.   BindingResult := krHandled;
  552. end;
  553.  
  554. procedure TClassicBinding.BackspaceDelete(const Context: IOTAKeyContext;
  555.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  556. begin
  557.   Context.EditBuffer.EditPosition.BackspaceDelete(1);
  558.   BindingResult := krHandled;
  559. end;
  560.  
  561. procedure TClassicBinding.CursorRight(const Context: IOTAKeyContext;
  562.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  563. begin
  564.   Context.EditBuffer.EditPosition.MoveRelative(0, 1);
  565.   BindingResult := krHandled;
  566. end;
  567.  
  568. procedure TClassicBinding.LineUp(const Context: IOTAKeyContext;
  569.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  570. begin
  571.   Context.EditBuffer.EditPosition.MoveRelative(-1, 0);
  572.   BindingResult := krHandled;
  573. end;
  574.  
  575. procedure TClassicBinding.PageDown(const Context: IOTAKeyContext;
  576.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  577. begin
  578.   Context.EditBuffer.TopView.PageDown;
  579.   BindingResult := krHandled;
  580. end;
  581.  
  582. procedure TClassicBinding.CursorLeft(const Context: IOTAKeyContext;
  583.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  584. begin
  585.   Context.EditBuffer.EditPosition.MoveRelative(0, -1);
  586.   BindingResult := krHandled;
  587. end;
  588.  
  589. procedure TClassicBinding.LineDown(const Context: IOTAKeyContext;
  590.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  591. begin
  592.   Context.EditBuffer.EditPosition.MoveRelative(1, 0);
  593.   BindingResult := krHandled;
  594. end;
  595.  
  596. procedure TClassicBinding.PageUp(const Context: IOTAKeyContext;
  597.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  598. begin
  599.   Context.EditBuffer.TopView.PageUp;
  600.   BindingResult := krHandled;
  601. end;
  602.  
  603. procedure TClassicBinding.DeleteWordRight(const Context: IOTAKeyContext;
  604.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  605. var
  606.   EP: IOTAEditPosition;
  607.   EB: IOTAEditBlock;
  608.   EV: IOTAEditView;
  609.   Blocked: Boolean;
  610.   C, SpaceAdjust: Integer;
  611. begin
  612.   EV := Context.EditBuffer.TopView;
  613.   EB := EV.Block;
  614.   EP := EV.Position;
  615.   if (EB.Style <> btNonInclusive) or (EB.Size <> 0) then
  616.   begin
  617.     EB.Save;
  618.     try
  619.       EP.Save;
  620.       try
  621.         EP.Move(EB.StartingRow, EB.StartingColumn);
  622.         EV.BookmarkRecord(BOOKMARK_ID_SYSTEM_ONE);
  623.         EP.Move(EB.EndingRow,EB.EndingColumn);
  624.         EV.BookmarkRecord(BOOKMARK_ID_SYSTEM_TWO);
  625.       finally
  626.         EP.Restore;
  627.       end;
  628.     finally
  629.       EB.Restore;
  630.     end;
  631.     Blocked := True;
  632.   end else
  633.     Blocked := False;
  634.   EB.Style := btNonInclusive;
  635.   EB.Reset;
  636.   EB.BeginBlock;
  637.   SpaceAdjust := 0;
  638.   EV.BookmarkRecord(BOOKMARK_ID_SYSTEM_THREE);
  639.   if EP.IsWhiteSpace then
  640.   begin
  641.     if EP.Character = #9 then
  642.     begin
  643.       C := EP.Column;
  644.       EP.Delete(1);
  645.       if C <> EP.Column then
  646.         SpaceAdjust := C - EP.Column;
  647.     end;
  648.     EP.MoveCursor(mmSkipRight or mmSkipWhite);
  649.   end
  650.   else if EP.IsWordCharacter then
  651.   begin
  652.     EP.MoveCursor(mmSkipRight or mmSkipWord);
  653.     EP.MoveCursor(mmSkipRight or mmSkipWhite);
  654.   end
  655.   else if EP.IsSpecialCharacter then
  656.   begin
  657.     EP.Delete(1);
  658.     EP.MoveCursor(mmSkipRight or mmSkipWhite);
  659.   end
  660.   else
  661.     EP.Delete(1);
  662.   EB.EndBlock;
  663.   EB.Delete;
  664.   while SpaceAdjust > 0 do
  665.   begin
  666.     EP.InsertCharacter(' ');
  667.     Dec(SpaceAdjust);
  668.   end;
  669.   if Blocked then
  670.   begin
  671.     EB.Style := btNonInclusive;
  672.     EP.Save;
  673.     try
  674.       EV.BookmarkGoto(BOOKMARK_ID_SYSTEM_ONE);
  675.       EB.BeginBlock;
  676.       EV.BookmarkGoto(BOOKMARK_ID_SYSTEM_TWO);
  677.       EB.EndBlock;
  678.     finally
  679.       EP.Restore;
  680.     end;
  681.   end;
  682.   BindingResult := krHandled;
  683. end;
  684.  
  685. procedure TClassicBinding.Scroll(const Context: IOTAKeyContext;
  686.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  687. var
  688.   EP: IOTAEditPosition;
  689.   EV: IOTAEditView;
  690.   Delta: Integer;
  691. begin
  692.   EV := Context.EditBuffer.TopView;
  693.   EP := EV.Position;
  694.   Delta := Integer(Context.Context);
  695.   EV.Scroll(Delta, 0);
  696.   if EP.Row >= EV.GetBottomRow then
  697.   begin
  698.     EP.Move(EP.Row - 1, EP.Column);
  699.     EV.MoveViewToCursor;
  700.   end;
  701.   if EP.Row < EV.GetTopRow then
  702.   begin
  703.     EP.Move(EP.Row + 1, EP.Column);
  704.     EV.MoveViewToCursor;
  705.   end;
  706.   BindingResult := krHandled;
  707. end;
  708.  
  709. procedure TClassicBinding.DeleteChar(const Context: IOTAKeyContext;
  710.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  711. begin
  712.   Context.EditBuffer.EditPosition.Delete(1);
  713.   BindingResult := krHandled;
  714. end;
  715.  
  716. procedure TClassicBinding.InsertTab(const Context: IOTAKeyContext;
  717.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  718. var
  719.   EP: IOTAEditPosition;
  720.   EO: IOTABufferOptions;
  721. begin
  722.   EP := Context.EditBuffer.EditPosition;
  723.   EO := Context.EditBuffer.BufferOptions;
  724.   if not EO.InsertMode then
  725.     EP.Tab(1)
  726.   else if EO.SmartTab then
  727.     EP.Align(1)
  728.   else
  729.     EP.InsertCharacter(#9);
  730.   BindingResult := krHandled;
  731. end;
  732.  
  733. procedure TClassicBinding.HomeCursor(const Context: IOTAKeyContext;
  734.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  735. begin
  736.   Context.EditBuffer.EditPosition.Move(Context.EditBuffer.TopView.TopRow, 0);
  737.   BindingResult := krHandled;
  738. end;
  739.  
  740. procedure TClassicBinding.EndCursor(const Context: IOTAKeyContext;
  741.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  742. begin
  743.   Context.EditBuffer.EditPosition.Move(Context.EditBuffer.TopView.BottomRow, 0);
  744.   BindingResult := krHandled;
  745. end;
  746.  
  747. procedure TClassicBinding.MarkBlockBegin(const Context: IOTAKeyContext;
  748.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  749. var
  750.   EB: IOTAEditBlock;
  751.   EP: IOTAEditPosition;
  752.   EV: IOTAEditView;
  753.   EndCol, EndRow: Integer;
  754.   TopRow, LeftCol: Integer;
  755. begin
  756.   EB := Context.EditBuffer.EditBlock;
  757.   EP := Context.EditBuffer.EditPosition;
  758.   EV := Context.EditBuffer.TopView;
  759.   if (EB.Style <> btNonInclusive) or (EB.Size <> 0) then
  760.   begin
  761.     TopRow := EV.TopRow;
  762.     LeftCol := EV.LeftColumn;
  763.     EndCol := EB.EndingColumn;
  764.     EndRow := EB.EndingRow;
  765.     if EP.Row = EndRow then
  766.       if EP.Column >= EndCol then
  767.         EndCol := EP.Column;
  768.     if EP.Row > EndRow then
  769.       EndRow := EP.Row;
  770.     EP.Save;
  771.     try
  772.       EB.Reset;
  773.       EB.BeginBlock;
  774.       EB.Style := btNonInclusive;
  775.       EP.Move(EndRow, EndCol);
  776.       EB.EndBlock;
  777.     finally
  778.       EP.Restore;
  779.     end;
  780.     EV.SetTopLeft(TopRow, LeftCol);
  781.   end else
  782.   begin
  783.     EB.Reset;
  784.     EB.BeginBlock;
  785.     EB.Style := btNonInclusive;
  786.   end;
  787.   BindingResult := krHandled;
  788. end;
  789.  
  790. procedure TClassicBinding.MarkBlockEnd(const Context: IOTAKeyContext;
  791.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  792. var
  793.   EB: IOTAEditBlock;
  794.   EP: IOTAEditPosition;
  795.   StartRow, StartCol: Integer;
  796. begin
  797.   EB := Context.EditBuffer.EditBlock;
  798.   EP := Context.EditBuffer.EditPosition;
  799.   if (EB.Style <> btNonInclusive) or (EB.Size <> 0) then
  800.   begin
  801.     StartCol := EB.StartingColumn;
  802.     StartRow := EB.StartingRow;
  803.     if EP.Row = StartRow then
  804.       if EP.Column <= StartCol then
  805.         StartCol := EP.Column;
  806.     if EP.Row < StartRow then
  807.       StartRow := EP.Row;
  808.     EP.Save;
  809.     try
  810.       EP.Move(StartRow, StartCol);
  811.       EB.Reset;
  812.       EB.BeginBlock;
  813.       EB.Style := btNonInclusive;
  814.     finally
  815.       EP.Restore;
  816.     end;
  817.   end;
  818.   EB.EndBlock;
  819.   EB.Style := btNonInclusive;
  820.   BindingResult := krHandled;
  821. end;
  822.  
  823. resourcestring
  824.   sBlockCopied = 'Block copied';
  825.  
  826. procedure TClassicBinding.CopyBlock(const Context: IOTAKeyContext;
  827.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  828. var
  829.   EB: IOTAEditBlock;
  830. begin
  831.   EB := Context.EditBuffer.EditBlock;
  832.   if EB.Size <> 0 then
  833.   begin
  834.     EB.Copy(False);
  835.     Context.EditBuffer.EditPosition.Paste;
  836.     Context.EditBuffer.TopView.SetTempMsg(sBlockCopied);
  837.   end else
  838.     Context.EditBuffer.TopView.SetTempMsg(sNoBlockMarked);
  839. end;
  840.  
  841. procedure TClassicBinding.AdjustWordCase(const Context: IOTAKeyContext;
  842.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  843. var
  844.   EB: IOTAEditBlock;
  845.   EV: IOTAEditView;
  846.   Blocked: Boolean;
  847. begin
  848.   EV := Context.EditBuffer.TopView;
  849.   EB := EV.Block;
  850.   if EB.Size <> 0 then
  851.   begin
  852.     EB.Save;
  853.     Blocked := True;
  854.   end else
  855.     Blocked := False;
  856.   try
  857.     EV.BookmarkRecord(BOOKMARK_ID_SYSTEM_ONE);
  858.     try
  859.       if LongBool(Context.Context) then
  860.         MarkWord(Context).LowerCase
  861.       else MarkWord(Context).UpperCase;
  862.       EB.Reset;
  863.     finally
  864.       EV.BookmarkGoto(BOOKMARK_ID_SYSTEM_ONE);
  865.     end;
  866.   finally
  867.     if Blocked then
  868.       EB.Restore;
  869.   end;
  870.   BindingResult := krHandled;
  871. end;
  872.  
  873. procedure TClassicBinding.ToggleBlock(const Context: IOTAKeyContext;
  874.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  875. begin
  876.   Context.EditBuffer.EditBlock.Visible := not Context.EditBuffer.EditBlock.Visible;
  877.   BindingResult := krHandled;
  878. end;
  879.  
  880. procedure TClassicBinding.IndentBlock(const Context: IOTAKeyContext;
  881.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  882. begin
  883.   SlideBlock(Context, LongBool(Context.Context));
  884.   BindingResult := krHandled;
  885. end;
  886.  
  887. procedure TClassicBinding.MarkLine(const Context: IOTAKeyContext;
  888.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  889. var
  890.   EP: IOTAEditPosition;
  891.   EB: IOTAEditBlock;
  892. begin
  893.   EP := Context.EditBuffer.EditPosition;
  894.   EB := Context.EditBuffer.EditBlock;
  895.   EP.Save;
  896.   try
  897.     EP.Move(0, 1);
  898.     EB.Style := btNonInclusive;
  899.     EB.BeginBlock;
  900.     EP.MoveRelative(1, 0);
  901.     EB.EndBlock;
  902.   finally
  903.     EP.Restore;
  904.   end;
  905.   BindingResult := krHandled;    
  906. end;
  907.  
  908. procedure TClassicBinding.AdjustBlockCase(const Context: IOTAKeyContext;
  909.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  910. var
  911.   EB: IOTAEditBlock;
  912. begin
  913.   EB := Context.EditBuffer.EditBlock;
  914.   if EB.Size <> 0 then
  915.   begin
  916.     if Context.Context <> nil then
  917.       EB.LowerCase
  918.     else EB.UpperCase;
  919.   end else
  920.     Context.EditBuffer.TopView.SetTempMsg(sNoBlockMarked);
  921.   BindingResult := krHandled;
  922. end;
  923.  
  924. procedure TClassicBinding.InsertFile(const Context: IOTAKeyContext;
  925.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  926. var
  927.   EP: IOTAEditPosition;
  928. begin
  929.   EP := Context.EditBuffer.EditPosition;
  930.   EP.Save;
  931.   try
  932.     EP.InsertFile('');
  933.   finally
  934.     EP.Restore;
  935.   end;
  936.   BindingResult := krHandled;
  937. end;
  938.  
  939. procedure TClassicBinding.ClassicMarkWord(const Context: IOTAKeyContext;
  940.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  941. var
  942.   EP: IOTAEditPosition;
  943. begin
  944.   EP := Context.EditBuffer.EditPosition;
  945.   if not EP.IsWordCharacter then
  946.     WordLeft(Context, KeyCode, BindingResult);
  947.   MarkWord(Context);
  948.   BindingResult := krHandled;
  949. end;
  950.  
  951. resourcestring
  952.   sBlockMoved = 'Block moved';
  953.  
  954. procedure TClassicBinding.ClassicMoveBlock(const Context: IOTAKeyContext;
  955.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  956. var
  957.   EP: IOTAEditPosition;
  958.   EB: IOTAEditBlock;
  959.   EV: IOTAEditView;
  960.   NewRow, NewColumn: Integer;
  961. begin
  962.   EP := Context.EditBuffer.EditPosition;
  963.   EB := Context.EditBuffer.EditBlock;
  964.   EV := Context.EditBuffer.TopView;
  965.   if EB.Size <> 0 then
  966.   begin
  967.     EV.BookmarkRecord(BOOKMARK_ID_SYSTEM_ONE);
  968.     EB.Save;
  969.     try
  970.       EP.Move(EB.StartingRow, EB.StartingColumn);
  971.     finally
  972.       EB.Restore;
  973.     end;
  974.     EB.Cut(False);
  975.     EV.BookmarkGoto(BOOKMARK_ID_SYSTEM_ONE);
  976.     NewRow := EP.Row;
  977.     NewColumn := EP.Column;
  978.     EP.Paste;
  979.     EP.Move(NewRow, NewColumn);
  980.     EB.BeginBlock;
  981.     EV.BookmarkGoto(BOOKMARK_ID_SYSTEM_ONE);
  982.     EB.Extend(EP.Row, EP.Column);
  983.     EB.Save;
  984.     try
  985.       EP.Move(NewRow, NewColumn);
  986.     finally
  987.       EB.Restore;
  988.     end;
  989.     EV.SetTempMsg(sBlockMoved);
  990.   end else
  991.     EV.SetTempMsg(sNoBlockMarked);
  992.   BindingResult := krHandled;
  993. end;
  994.  
  995. resourcestring
  996.   sBlockDeleted = 'Block deleted';
  997.  
  998. procedure TClassicBinding.ClassicBlockDelete(const Context: IOTAKeyContext;
  999.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1000. var
  1001.   EB: IOTAEditBlock;
  1002.   EV: IOTAEditView;
  1003. begin
  1004.   EV := Context.EditBuffer.TopView;
  1005.   EB := EV.Block;
  1006.   if EB.Size <> 0 then
  1007.   begin
  1008.     EV.BookmarkRecord(BOOKMARK_ID_SYSTEM_ONE);
  1009.     EB.Delete;
  1010.     EV.BookmarkGoto(BOOKMARK_ID_SYSTEM_ONE);
  1011.     EV.SetTempMsg(sBlockDeleted);
  1012.   end else
  1013.     EV.SetTempMsg(sNoBlockMarked);
  1014.   BindingResult := krHandled;
  1015. end;
  1016.  
  1017. procedure TClassicBinding.SetBookmark(const Context: IOTAKeyContext;
  1018.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1019. begin
  1020.   Context.EditBuffer.TopView.BookmarkToggle(Integer(Context.Context));
  1021.   BindingResult := krHandled;
  1022. end;
  1023.  
  1024. procedure TClassicBinding.ClassicToggleCase(const Context: IOTAKeyContext;
  1025.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1026. var
  1027.   EP: IOTAEditPosition;
  1028.   EB: IOTAEditBlock;
  1029.   Blocked: Boolean;
  1030. begin
  1031.   EB := Context.EditBuffer.EditBlock;
  1032.   EP := Context.EditBuffer.EditPosition;
  1033.   if EB.Size <> 0 then
  1034.   begin
  1035.     EB.Save;
  1036.     Blocked := True;
  1037.   end else
  1038.     Blocked := False;
  1039.   try
  1040.     if ((EP.Column <= EB.EndingColumn) and (EP.Row <= EB.EndingRow)) and
  1041.       ((EP.Column >= EB.StartingColumn) and (EP.Row >= EB.StartingRow)) then
  1042.       EB.ToggleCase
  1043.     else
  1044.     begin
  1045.       EB.BeginBlock;
  1046.       EP.MoveRelative(0, 1);
  1047.       EB.EndBlock;
  1048.       EB.ToggleCase;
  1049.       EB.Reset;
  1050.     end;
  1051.   finally
  1052.     if Blocked then
  1053.       EB.Restore;
  1054.   end;
  1055. end;
  1056.  
  1057. resourcestring
  1058.   sLiteralKeyInserted = 'Literal key inserted';
  1059.  
  1060. procedure TClassicBinding.LiteralKeyProc(const Context: IOTAKeyContext;
  1061.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1062. var
  1063.   Key: Word;
  1064.   Shift: TShiftState;
  1065. begin
  1066.   ShortCutToKey(KeyCode, Key, Shift);
  1067.   if Shift = [ssCtrl] then
  1068.   begin
  1069.     if (Key >= $40) and (Key < $5F) then
  1070.     begin
  1071.       Dec(Key, $40);
  1072.       Shift := [];
  1073.     end else if (Key >= $60) and (Key < $7F) then
  1074.     begin
  1075.       Dec(Key, $60);
  1076.       Shift := [];
  1077.     end;
  1078.   end;
  1079.   if Shift = [] then
  1080.     Context.EditBuffer.EditPosition.InsertCharacter(Char(Key));
  1081.   Context.EditBuffer.TopView.SetTempMsg(sLiteralKeyInserted);
  1082.   Context.KeyboardServices.PopKeyboard('LiteralKeyTable'); //do not localize
  1083.   BindingResult := krHandled;
  1084. end;
  1085.  
  1086. procedure TClassicBinding.LoadKeyMacro(const Context: IOTAKeyContext;
  1087.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1088. var
  1089.   KS: IOTAKeyboardServices;
  1090.   Stream: IStream;
  1091. begin
  1092.   KS := Context.KeyboardServices;
  1093.   if not KS.CurrentPlayback.IsPlaying and not KS.CurrentRecord.IsRecording then
  1094.   begin
  1095.     with TSaveKeyMacroDlg.Create(Application) do
  1096.     try
  1097.       if OpenDialog1.Execute then
  1098.       try
  1099.         Stream := TStreamAdapter.Create(TFileStream.Create(OpenDialog1.FileName,
  1100.           fmOpenRead or fmShareDenyWrite), soOwned);
  1101.         KS.CurrentPlayback.Clear;
  1102.         KS.CurrentPlayback.ReadFromStream(Stream);
  1103.       except
  1104.         Application.HandleException(Self);
  1105.       end;
  1106.     finally
  1107.       Free;
  1108.     end;
  1109.   end;
  1110.   BindingResult := krHandled;
  1111. end;
  1112.  
  1113. resourcestring
  1114.   sInsertLiteralChar = 'Inserting literal character';
  1115.  
  1116. procedure TClassicBinding.InsertLiteralKey(const Context: IOTAKeyContext;
  1117.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1118. begin
  1119.   Context.KeyboardServices.PushKeyboard('LiteralKeyTable'); //do not localise
  1120.   Context.EditBuffer.TopView.SetTempMsg(sInsertLiteralChar);
  1121.   BindingResult := krHandled;
  1122. end;
  1123.  
  1124. procedure TClassicBinding.MoveCursorToBOF(const Context: IOTAKeyContext;
  1125.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1126. begin
  1127.   Context.EditBuffer.EditPosition.Move(1, 1);
  1128.   BindingResult := krHandled;
  1129. end;
  1130.  
  1131. procedure TClassicBinding.MoveCursorToEOF(const Context: IOTAKeyContext;
  1132.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1133. begin
  1134.   Context.EditBuffer.EditPosition.MoveEOF;
  1135.   BindingResult := krHandled;
  1136. end;
  1137.  
  1138. procedure TClassicBinding.MoveCursorToMarkBegin(const Context: IOTAKeyContext; KeyCode: TShortCut;
  1139.   var BindingResult: TKeyBindingResult);
  1140. var
  1141.   EB: IOTAEditBlock;
  1142. begin
  1143.   EB := Context.EditBuffer.EditBlock;
  1144.   if EB.Visible and (EB.Size <> 0) then
  1145.   begin
  1146.     EB.Save;
  1147.     try
  1148.       Context.EditBuffer.EditPosition.Move(EB.StartingRow, EB.StartingColumn);
  1149.     finally
  1150.       EB.Restore;
  1151.     end;
  1152.   end else
  1153.     Context.EditBuffer.TopView.SetTempMsg(sNoBlockMarked);
  1154.   BindingResult := krHandled;
  1155. end;
  1156.  
  1157. procedure TClassicBinding.MoveCursorToBOL(const Context: IOTAKeyContext;
  1158.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1159. begin
  1160.   Context.EditBuffer.EditPosition.MoveBOL;
  1161.   BindingResult := krHandled;
  1162. end;
  1163.  
  1164. procedure TClassicBinding.MoveCursorToEOL(const Context: IOTAKeyContext;
  1165.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1166. begin
  1167.   Context.EditBuffer.EditPosition.MoveEOL;
  1168.   BindingResult := krHandled;
  1169. end;
  1170.  
  1171. procedure TClassicBinding.MoveCursorToMarkEnd(const Context: IOTAKeyContext; KeyCode: TShortCut;
  1172.   var BindingResult: TKeyBindingResult);
  1173. var
  1174.   EB: IOTAEditBlock;
  1175. begin
  1176.   EB := Context.EditBuffer.EditBlock;
  1177.   if EB.Visible and (EB.Size <> 0) then
  1178.   begin
  1179.     EB.Save;
  1180.     try
  1181.       Context.EditBuffer.EditPosition.Move(EB.EndingRow, EB.EndingColumn);
  1182.     finally
  1183.       EB.Restore;
  1184.     end;
  1185.   end else
  1186.     Context.EditBuffer.TopView.SetTempMsg(sNoBlockMarked);
  1187.   BindingResult := krHandled;
  1188. end;
  1189.  
  1190. procedure TClassicBinding.MoveCursorToLastEdit(const Context: IOTAKeyContext; KeyCode: TShortCut;
  1191.   var BindingResult: TKeyBindingResult);
  1192. var
  1193.   EP: IOTAEditPosition;
  1194.   EV: IOTAEditView;
  1195. begin
  1196.   EP := Context.EditBuffer.EditPosition;
  1197.   EV := Context.EditBuffer.TopView;
  1198.   EP.Move(EV.GetLastEditRow, EV.GetLastEditColumn);
  1199.   BindingResult := krHandled;
  1200. end;
  1201.  
  1202. procedure TClassicBinding.MoveLineViewBottom(const Context: IOTAKeyContext;
  1203.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1204. var
  1205.   EV: IOTAEditView;
  1206.   Row, TopRow, BottomRow, Height: Integer;
  1207. begin
  1208.   EV := Context.EditBuffer.TopView;
  1209.   Row := EV.Position.GetRow;
  1210.   TopRow := EV.TopRow;
  1211.   BottomRow := EV.BottomRow;
  1212.   Height := BottomRow - TopRow;
  1213.   if Row > Height then
  1214.     EV.SetTopLeft(Row - (Height - 1), 0);
  1215.   BindingResult := krHandled;
  1216. end;
  1217.  
  1218. procedure TClassicBinding.MoveLineViewTop(const Context: IOTAKeyContext;
  1219.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1220. var
  1221.   EV: IOTAEditView;
  1222. begin
  1223.   EV := Context.EditBuffer.TopView;
  1224.   EV.SetTopLeft(EV.Position.Row, 0);
  1225.   BindingResult := krHandled;
  1226. end;
  1227.  
  1228. procedure TClassicBinding.GotoBookmark(const Context: IOTAKeyContext;
  1229.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1230. begin
  1231.   Context.EditBuffer.TopView.BookmarkGoto(Integer(Context.Context));
  1232.   BindingResult := krHandled;
  1233. end;
  1234.  
  1235. procedure TClassicBinding.ToggleInsertMode(const Context: IOTAKeyContext;
  1236.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1237. var
  1238.   EO: IOTABufferOptions;
  1239. begin
  1240.   EO := Context.KeyboardServices.EditorServices.EditOptions.BufferOptions;
  1241.   EO.InsertMode := not EO.InsertMode;
  1242.   BindingResult := krHandled;
  1243. end;
  1244.  
  1245. procedure TClassicBinding.ToggleMacroRecord(const Context: IOTAKeyContext;
  1246.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1247. var
  1248.   KS: IOTAKeyboardServices;
  1249.   Stream: IStream;
  1250. begin
  1251.   KS := Context.KeyboardServices;
  1252.   if not KS.CurrentPlayback.IsPlaying then
  1253.     if KS.CurrentRecord.IsRecording then
  1254.     begin
  1255.       KS.ResumeRecord;
  1256.       with TSaveKeyMacroDlg.Create(Application) do
  1257.       try
  1258.         if ShowModal = mrOK then
  1259.         try
  1260.           Stream := TStreamAdapter.Create(TFileStream.Create(Edit1.Text, fmCreate), soOwned);
  1261.           KS.CurrentRecord.WriteToStream(Stream);
  1262.         except
  1263.           Application.HandleException(Self);
  1264.         end;
  1265.       finally
  1266.         Free;
  1267.       end;
  1268.     end else
  1269.       KS.ResumeRecord;
  1270.   BindingResult := krHandled;
  1271. end;
  1272.  
  1273. procedure TClassicBinding.ClassicDeleteLine(const Context: IOTAKeyContext;
  1274.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1275. var
  1276.   EV: IOTAEditView;
  1277.   EP: IOTAEditPosition;
  1278.   EB: IOTAEditBlock;
  1279.   Blocked: Boolean;
  1280.   Style: TOTABlockType;
  1281. begin
  1282.   EV := Context.EditBuffer.TopView;
  1283.   EP := EV.Position;
  1284.   EB := EV.Block;
  1285.   if EB.Size <> 0 then
  1286.   begin
  1287.     EB.Save;
  1288.     try
  1289.       EP.Save;
  1290.       try
  1291.         EP.Move(EB.StartingRow, EB.StartingColumn);
  1292.         EV.BookmarkRecord(BOOKMARK_ID_SYSTEM_ONE);
  1293.         EP.Move(EB.EndingRow, EB.EndingColumn);
  1294.         EV.BookmarkRecord(BOOKMARK_ID_SYSTEM_TWO);
  1295.         Blocked := True;
  1296.       finally
  1297.         EP.Restore;
  1298.       end;
  1299.     finally
  1300.       EB.Restore;
  1301.     end;
  1302.   end else
  1303.     Blocked := False;
  1304.   try
  1305.     Style := EB.Style;
  1306.     try
  1307.       EP.MoveBOL;
  1308.       EP.Save;
  1309.       try
  1310.         EB.Reset;
  1311.         EB.Style := btLine;
  1312.         EB.BeginBlock;
  1313.         EB.Delete;
  1314.       finally
  1315.         EP.Restore;
  1316.       end;
  1317.     finally
  1318.       EB.Style := Style;
  1319.     end;
  1320.   finally
  1321.     if Blocked then
  1322.     begin
  1323.       EP.Save;
  1324.       try
  1325.         EV.BookmarkGoto(BOOKMARK_ID_SYSTEM_ONE);
  1326.         EB.BeginBlock;
  1327.         EV.BookmarkGoto(BOOKMARK_ID_SYSTEM_TWO);
  1328.         EB.EndBlock;
  1329.       finally
  1330.         EP.Restore;
  1331.       end;
  1332.     end;
  1333.   end;
  1334.   BindingResult := krHandled;
  1335. end;
  1336.  
  1337. procedure TClassicBinding.MoveCursorHorizontal(const Context: IOTAKeyContext; KeyCode: TShortCut;
  1338.   var BindingResult: TKeyBindingResult);
  1339. begin
  1340.   Context.EditBuffer.EditPosition.MoveRelative(0, Integer(Context.Context));
  1341.   BindingResult := krHandled;
  1342. end;
  1343.  
  1344. procedure TClassicBinding.MoveCursorVertical(const Context: IOTAKeyContext;
  1345.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1346. begin
  1347.   Context.EditBuffer.EditPosition.MoveRelative(Integer(Context.Context), 0);
  1348.   BindingResult := krHandled;
  1349. end;
  1350.  
  1351. procedure TClassicBinding.InsertCharacter(const Context: IOTAKeyContext;
  1352.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1353. begin
  1354.   Context.EditBuffer.EditPosition.InsertCharacter(Char(Byte(Context.Context)));
  1355.   BindingResult := krHandled;
  1356. end;
  1357.  
  1358. procedure TClassicBinding.ClassicMarkToViewBottom(const Context: IOTAKeyContext; KeyCode: TShortCut;
  1359.   var BindingResult: TKeyBindingResult);
  1360. var
  1361.   EV: IOTAEditView;
  1362.   EP: IOTAEditPosition;
  1363.   EB: IOTAEditBlock;
  1364. begin
  1365.   EV := Context.EditBuffer.TopView;
  1366.   EP := EV.Position;
  1367.   EB := EV.Block;
  1368.   if (EB.EndingRow = EP.Row) and (EB.EndingColumn = EP.Column) then
  1369.   begin
  1370. //    EB.Style := btNonInclusive;
  1371.     EP.Move(EB.StartingRow, EB.StartingColumn);
  1372.     EB.BeginBlock;
  1373.     EB.Extend(EV.BottomRow - 1, EP.Column);
  1374.     EB.EndBlock;
  1375.   end else
  1376.   begin
  1377.     EB.Reset;
  1378. //    EB.Style := btNonInclusive;
  1379.     EB.BeginBlock;
  1380.     EB.Extend(EV.BottomRow - 1, EP.Column);
  1381.     EB.EndBlock;
  1382.   end;
  1383.   BindingResult := krHandled;
  1384. end;
  1385.  
  1386. procedure TClassicBinding.ClassicMarkToViewTop(const Context: IOTAKeyContext; KeyCode: TShortCut;
  1387.   var BindingResult: TKeyBindingResult);
  1388. var
  1389.   EV: IOTAEditView;
  1390.   EP: IOTAEditPosition;
  1391.   EB: IOTAEditBlock;
  1392. begin
  1393.   EV := Context.EditBuffer.TopView;
  1394.   EP := EV.Position;
  1395.   EB := EV.Block;
  1396.   if (EB.StartingRow = EP.Row) and (EB.StartingColumn = EP.Column) then
  1397.   begin
  1398. //    EB.Style := btNonInclusive;
  1399.     EP.Move(EB.EndingRow, EB.EndingColumn);
  1400.     EB.EndBlock;
  1401.     EB.Extend(EV.TopRow, EP.Column);
  1402.     EB.BeginBlock;
  1403.   end else
  1404.   begin
  1405.     EB.Reset;
  1406. //    EB.Style := btNonInclusive;
  1407.     EB.EndBlock;
  1408.     EB.Extend(EV.TopRow, EP.Column);
  1409.     EB.BeginBlock;
  1410.   end;
  1411.   BindingResult := krHandled;
  1412. end;
  1413.  
  1414. procedure TClassicBinding.MarkToWordLeft(const Context: IOTAKeyContext;
  1415.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1416. var
  1417.   EB: IOTAEditBlock;
  1418.   EP: IOTAEditPosition;
  1419.   NewRow, NewColumn: Integer;
  1420. begin
  1421.   EB := Context.EditBuffer.EditBlock;
  1422.   EP := Context.EditBuffer.EditPosition;
  1423.   EP.Save;
  1424.   try
  1425.     EB.Save;
  1426.     try
  1427.       WordLeft(Context, KeyCode, BindingResult);
  1428.       NewRow := EP.Row;
  1429.       NewColumn := EP.Column;
  1430.     finally
  1431.       EB.Restore;
  1432.     end;
  1433.   finally
  1434.     EP.Restore;
  1435.   end;
  1436.   EB.Extend(NewRow, NewColumn);
  1437.   BindingResult := krHandled;
  1438. end;
  1439.  
  1440. procedure TClassicBinding.MarkToWordRight(const Context: IOTAKeyContext;
  1441.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1442. var
  1443.   EB: IOTAEditBlock;
  1444.   EP: IOTAEditPosition;
  1445.   NewRow, NewColumn: Integer;
  1446. begin
  1447.   EB := Context.EditBuffer.EditBlock;
  1448.   EP := Context.EditBuffer.EditPosition;
  1449.   EP.Save;
  1450.   try
  1451.     EB.Save;
  1452.     try
  1453.       WordRight(Context, KeyCode, BindingResult);
  1454.       NewRow := EP.Row;
  1455.       NewColumn := EP.Column;
  1456.     finally
  1457.       EB.Restore;
  1458.     end;
  1459.   finally
  1460.     EP.Restore;
  1461.   end;
  1462.   EB.Extend(NewRow, NewColumn);
  1463.   BindingResult := krHandled;
  1464. end;
  1465.  
  1466. procedure TClassicBinding.ClassicMarkToBOF(const Context: IOTAKeyContext;
  1467.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1468. var
  1469.   EV: IOTAEditView;
  1470.   EP: IOTAEditPosition;
  1471.   EB: IOTAEditBlock;
  1472. begin
  1473.   EV := Context.EditBuffer.TopView;
  1474.   EP := EV.Position;
  1475.   EB := EV.Block;
  1476.   if (EB.StartingRow = EP.Row) and (EB.StartingColumn = EP.Column) then
  1477.   begin
  1478. //    EB.Style := btNonInclusive;
  1479.     EP.Move(EB.EndingRow, EB.EndingColumn);
  1480.     EB.EndBlock;
  1481.     EP.Move(1, 1);
  1482.     EB.BeginBlock;
  1483.   end else
  1484.   begin
  1485.     EB.Reset;
  1486. //    EB.Style := btNonInclusive;
  1487.     EB.EndBlock;
  1488.     EP.Move(1, 1);
  1489.     EB.BeginBlock;
  1490.   end;
  1491.   BindingResult := krHandled;
  1492. end;
  1493.  
  1494. procedure TClassicBinding.ClassicMarkToEOF(const Context: IOTAKeyContext;
  1495.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1496. var
  1497.   EV: IOTAEditView;
  1498.   EP: IOTAEditPosition;
  1499.   EB: IOTAEditBlock;
  1500. begin
  1501.   EV := Context.EditBuffer.TopView;
  1502.   EP := EV.Position;
  1503.   EB := EV.Block;
  1504.   if (EB.StartingRow = EP.Row) and (EB.StartingColumn = EP.Column) then
  1505.   begin
  1506. //    EB.Style := btNonInclusive;
  1507.     EP.Move(EB.StartingRow, EB.StartingColumn);
  1508.     EB.EndBlock;
  1509.     EP.MoveEOF;
  1510.     EB.BeginBlock;
  1511.   end else
  1512.   begin
  1513.     EB.Reset;
  1514. //    EB.Style := btNonInclusive;
  1515.     EB.EndBlock;
  1516.     EP.MoveEOF;
  1517.     EB.BeginBlock;
  1518.   end;
  1519.   BindingResult := krHandled;
  1520. end;
  1521.  
  1522. procedure TClassicBinding.MarkToRelativeHoriz(const Context: IOTAKeyContext; KeyCode: TShortCut;
  1523.   var BindingResult: TKeyBindingResult);
  1524. begin
  1525.   Context.EditBuffer.EditBlock.ExtendRelative(0, Integer(Context.Context));
  1526.   BindingResult := krHandled;
  1527. end;
  1528.  
  1529. procedure TClassicBinding.MarkToRelativeVert(const Context: IOTAKeyContext;
  1530.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1531. begin
  1532.   Context.EditBuffer.EditBlock.ExtendRelative(Integer(Context.Context), 0);
  1533.   BindingResult := krHandled;
  1534. end;
  1535.  
  1536. procedure TClassicBinding.ClassicMarkToBOL(const Context: IOTAKeyContext;
  1537.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1538. var
  1539.   EV: IOTAEditView;
  1540.   EP: IOTAEditPosition;
  1541.   EB: IOTAEditBlock;
  1542.   EndRow, EndCol: Integer;
  1543. begin
  1544.   EV := Context.EditBuffer.TopView;
  1545.   EP := EV.Position;
  1546.   EB := EV.Block;
  1547.   EB.Save;
  1548.   try
  1549.     EP.Save;
  1550.     try
  1551.       EP.MoveBOL;
  1552.       EndRow := EP.Row;
  1553.       EndCol := EP.Column;
  1554.     finally
  1555.       EP.Restore;
  1556.     end;
  1557.   finally
  1558.     EB.Restore;
  1559.   end;
  1560.   EB.Extend(EndRow, EndCol);
  1561.   BindingResult := krHandled;
  1562. end;
  1563.  
  1564. procedure TClassicBinding.ClassicMarkToEOL(const Context: IOTAKeyContext;
  1565.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1566. var
  1567.   EV: IOTAEditView;
  1568.   EP: IOTAEditPosition;
  1569.   EB: IOTAEditBlock;
  1570.   EndRow, EndCol: Integer;
  1571. begin
  1572.   EV := Context.EditBuffer.TopView;
  1573.   EP := EV.Position;
  1574.   EB := EV.Block;
  1575.   EB.Save;
  1576.   try
  1577.     EP.Save;
  1578.     try
  1579.       EP.MoveEOL;
  1580.       EndRow := EP.Row;
  1581.       EndCol := EP.Column;
  1582.     finally
  1583.       EP.Restore;
  1584.     end;
  1585.   finally
  1586.     EB.Restore;
  1587.   end;
  1588.   EB.Extend(EndRow, EndCol);
  1589.   BindingResult := krHandled;
  1590. end;
  1591.  
  1592. procedure TClassicBinding.MarkToPageDown(const Context: IOTAKeyContext;
  1593.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1594. begin
  1595.   Context.EditBuffer.EditBlock.ExtendPageDown;
  1596.   BindingResult := krHandled;
  1597. end;
  1598.  
  1599. procedure TClassicBinding.MarkToPageUp(const Context: IOTAKeyContext;
  1600.   KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
  1601. begin
  1602.   Context.EditBuffer.EditBlock.ExtendPageUp;
  1603.   BindingResult := krHandled;
  1604. end;
  1605.  
  1606. end.
  1607.